/******************************************************************************* * Copyright (c) 2012, 2015 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation ******************************************************************************/ package org.eclipse.ui.internal.keys; import org.eclipse.core.commands.Command; import org.eclipse.core.commands.ParameterizedCommand; import org.eclipse.e4.core.commands.ECommandService; import org.eclipse.e4.core.contexts.IEclipseContext; import org.eclipse.e4.ui.bindings.EBindingService; import org.eclipse.e4.ui.bindings.internal.KeyAssistDialog; import org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher; import org.eclipse.jface.bindings.TriggerSequence; import org.eclipse.jface.preference.PreferenceDialog; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbenchCommandConstants; import org.eclipse.ui.dialogs.PreferencesUtil; /** * Extends the key conflict popup dialog to provide a full list of global key * bindings for the workbench. If {@link #open()} is called while this dialog is * still open, the keys preference page is opened. * * */ public class GlobalKeyAssistDialog extends KeyAssistDialog { /** * Context for this dialog, used to open services */ private IEclipseContext context; /** * ID of the key binding preference page */ private final String keysPageId = "org.eclipse.ui.preferencePages.Keys"; //$NON-NLS-1$ /** * Whether this dialog is currently open, if the dialog is opened again, we * open the preference page instead */ private boolean isOpen; /** * @param context * @param associatedKeyboard * @param associatedState */ public GlobalKeyAssistDialog(IEclipseContext context, KeyBindingDispatcher associatedKeyboard) { super(context, associatedKeyboard); this.context = context; setInfoText(getInfoText()); } @Override public int open() { if (isOpen) { return openPreferencePage(); } isOpen = true; return super.open(); } @Override public boolean close() { isOpen = false; return super.close(); } /** * Determines what keybinding was used to open this dialog and returns an * info string using that binding. ex: * "Press 'Ctrl-Shift-L') to open the preference page"; * * @return info text for this dialog */ private String getInfoText() { ECommandService commandService = context.getActiveLeaf().get(ECommandService.class); Command cmd = commandService.getCommand(IWorkbenchCommandConstants.WINDOW_SHOW_KEY_ASSIST); if (cmd != null) { EBindingService bindingService = context.getActiveLeaf().get(EBindingService.class); TriggerSequence keySeq = bindingService.getBestSequenceFor(new ParameterizedCommand( cmd, null)); if (keySeq != null) { return NLS.bind(KeyAssistMessages.openPreferencePage, keySeq.format()); } } return ""; //$NON-NLS-1$ } /** * Opens the key binding preference page, closes this dialog */ private int openPreferencePage() { // Create a preference dialog on the keys preference page. Shell shell = getShell(); if (shell.getParent() != null) { shell = shell.getParent().getShell(); } PreferenceDialog dialog = PreferencesUtil.createPreferenceDialogOn(shell, keysPageId, null, getSelectedBinding()); close(); return dialog.open(); } }